/**
 ******************************************************************************
 * @file    gpio.h
 * @author  hyseim software Team
 * @date    26-Mar-2024
 * @brief   This file provides all the headers of the gpio functions.
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2020 Hyseim. Co., Ltd.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_H__
#define __GPIO_H__

#ifdef __cplusplus
 extern "C"{
#endif

/* Includes ------------------------------------------------------------------*/
#include "utils.h"
#include "pad.h"

typedef struct
{
    __IO uint32_t DR;
    __IO uint32_t DDR;
         uint32_t RESERVED0[10];
    __IO uint32_t INTEN;
    __IO uint32_t INTMASK;
    __IO uint32_t INTTYPE_LEVEL;
    __IO uint32_t INT_POLARITY;
    __I  uint32_t INTSTATUS;
    __I  uint32_t RAW_INTSTATUS;
    __IO uint32_t DEBOUNCE;
    __O  uint32_t EOI;
    __I  uint32_t EXT_PORT;
         uint32_t RESERVED1[5];
    __IO uint32_t INT_BOTHEDGE;
    __I  uint32_t VER_ID_CODE;
         uint32_t RESERVED3[4];
} GPIO_TypeDef;

#define GPIOA           ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB           ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC           ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD           ((GPIO_TypeDef *) GPIOD_BASE)

/** @defgroup GPIO_Pins_define 
  * @{
  */
#define GPIO_PIN_0                  (0x00000001U)    /*!< Pin 0    */
#define GPIO_PIN_1                  (0x00000002U)    /*!< Pin 1    */
#define GPIO_PIN_2                  (0x00000004U)    /*!< Pin 2    */
#define GPIO_PIN_3                  (0x00000008U)    /*!< Pin 3    */
#define GPIO_PIN_4                  (0x00000010U)    /*!< Pin 4    */
#define GPIO_PIN_5                  (0x00000020U)    /*!< Pin 5    */
#define GPIO_PIN_6                  (0x00000040U)    /*!< Pin 6    */
#define GPIO_PIN_7                  (0x00000080U)    /*!< Pin 7    */
#define GPIO_PIN_8                  (0x00000100U)    /*!< Pin 8    */
#define GPIO_PIN_9                  (0x00000200U)    /*!< Pin 9    */
#define GPIO_PIN_10                 (0x00000400U)    /*!< Pin 10   */
#define GPIO_PIN_11                 (0x00000800U)    /*!< Pin 11   */
#define GPIO_PIN_12                 (0x00001000U)    /*!< Pin 12   */
#define GPIO_PIN_13                 (0x00002000U)    /*!< Pin 13   */
#define GPIO_PIN_14                 (0x00004000U)    /*!< Pin 14   */
#define GPIO_PIN_15                 (0x00008000U)    /*!< Pin 15   */
#define GPIO_PIN_16                 (0x00010000U)    /*!< Pin 16   */
#define GPIO_PIN_17                 (0x00020000U)    /*!< Pin 17   */
#define GPIO_PIN_18                 (0x00040000U)    /*!< Pin 18   */
#define GPIO_PIN_19                 (0x00080000U)    /*!< Pin 19   */
#define GPIO_PIN_20                 (0x00100000U)    /*!< Pin 20   */
#define GPIO_PIN_21                 (0x00200000U)    /*!< Pin 21   */
#define GPIO_PIN_22                 (0x00400000U)    /*!< Pin 22   */
#define GPIO_PIN_23                 (0x00800000U)    /*!< Pin 23   */
#define GPIO_PIN_24                 (0x01000000U)    /*!< Pin 24   */
#define GPIO_PIN_25                 (0x02000000U)    /*!< Pin 25   */
#define GPIO_PIN_26                 (0x04000000U)    /*!< Pin 26   */
#define GPIO_PIN_27                 (0x08000000U)    /*!< Pin 27   */
#define GPIO_PIN_28                 (0x10000000U)    /*!< Pin 28   */
#define GPIO_PIN_29                 (0x20000000U)    /*!< Pin 29   */
#define GPIO_PIN_30                 (0x40000000U)    /*!< Pin 30   */
#define GPIO_PIN_31                 (0x80000000U)    /*!< Pin 31   */
#define GPIO_PIN_All                (0xFFFFFFFFU)    /*!< All pins */

typedef enum
{
    GPIO_MODE_INPUT,
    GPIO_MODE_OUTPOT,
} GPIOMode;

typedef enum
{
    GPIO_LOW_LEVEL,
    GPIO_HIGH_LEVEl,
} GPIOLevel;

typedef enum
{
    GPIO_INTR_LOW_LEVEL,
    GPIO_INTR_HIGH_LEVEL,
    GPIO_INTR_NEGEDGE,
    GPIO_INTR_POSEDGE,
    GPIO_INTR_ANYEDGE,
} GPIOIntrType;

void GPIO_SetDirection(GPIO_TypeDef *GPIOx, uint32_t pin, GPIOMode mode);
void GPIO_SetLevel(GPIO_TypeDef *GPIOx, uint32_t pin, GPIOLevel level);
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_ClearBits(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_InputEnable(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_OutputEnable(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_IntEnable(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_IntDisable(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_SetIntMask(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_ClrIntMask(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_SetIntType(GPIO_TypeDef *GPIOx, uint32_t pin, GPIOIntrType type);
uint32_t GPIO_GetIntStatus(GPIO_TypeDef *GPIOx, uint32_t pin);
uint32_t GPIO_GetRawIntStatus(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_EnableDebounce(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_DisableDebounce(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_SetEOI(GPIO_TypeDef *GPIOx, uint32_t pin);
void GPIO_ClrEOI(GPIO_TypeDef *GPIOx, uint32_t pin);
uint32_t GPIO_GetExt(GPIO_TypeDef *GPIOx, uint32_t pin);

#ifdef __cplusplus
}
#endif
#endif /* __GPIO_H__ */
